//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/.
// 			VisualNovelToolkit		     /_/_/_/_/_/_/_/_/_/.
// Copyright ©2013 - Sol-tribe.	/_/_/_/_/_/_/_/_/_/.
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ByteCodeScriptTools{
	static public string parentPath = "ScriptEngine/Examples/Resources/CompiledScenario";
	static public string fileCachedFolderName = "/Cached";
/*	
	static public void InstantRunCode( byte[] codes ){
		VM vm = VM.Instance;	
		if( vm != null ){						
			vm.SetCode( codes );
			vm.Run( 0 );
		}
		else{
			ViNoDebugger.LogError( "VM NOT FOUND . Please Drag and Drop a Scenario Prefab in Your Scene." );				
		}
	}
//*/	
	static public void AddJumpTargetCode( List<byte> byteList , string jumpNodeLabel ){
		byteList.Add( Opcode.JUMP );		
		AddStringCode( byteList , jumpNodeLabel );	
	}
		
	static public void AddAssignStringCode( List<byte> byteList , string leftKey , string rightStr ){
		byteList.Add( Opcode.ASSIGN_STRING );			// 121 : Opcode.ASSIGN.			
		AddStringCode( byteList  , leftKey );
//		byteList.Add( Opcode.STRING );			// Righthand Opcode .		
		AddStringCode( byteList  , rightStr );		
	}
	
#if false	
	static public void AddAssignTableCode( List<byte> byteList , string leftKey , Hashtable tbl ){
		byteList.Add( Opcode.ASSIGN );			// 121 : Opcode.ASSIGN.			
		AddStringCode( byteList  , leftKey );
		AddTablePairsCode( byteList , tbl );
	}	
#endif
	
	static public void AddMessagingCode( List<byte> byteList , string targetName , byte opcodeMsg ){
		byteList.Add( Opcode.MESSAGING );
		ByteCodeScriptTools.AddStringCode( byteList , targetName );					
		
		byteList.Add( opcodeMsg );								
	}
	
	static public void AddTextLiteralCode( List<byte> byteList , string str  ){
		byteList.Add( Opcode.TEXT );
		AddStringCode( byteList , str );
	}		
	
	static public void AddVarCode( List<byte> byteList , string key ){
		byteList.Add( Opcode.VAR );
		AddStringCode( byteList , key );						
	}
	
//	static private int m_StringIndex;
	static public void AddStringCode( List<byte> byteList , string str ){
		byteList.Add( Opcode.STRING );
#if true
		int strLen = str.Length;
		byte[] bytes = System.BitConverter.GetBytes( strLen );		
		byteList.Add( bytes[ 3 ] );
		byteList.Add( bytes[ 2 ] );
		byteList.Add( bytes[ 1 ] );
		byteList.Add( bytes[ 0 ] );
#else
		byteList.Add( (byte)str.Length );
#endif
	 	byte[] temp = System.Text.Encoding.Unicode.GetBytes( str );
		for( int i=0;i<temp.Length;i++){
			byteList.Add( temp[ i ] );	
		}		
	}
	
	static public void AddNodeCode(  List<byte> byteList , string tag ){
		byteList.Add( Opcode.NODE );
		AddStringCode( byteList ,  tag );
	}
	
	static public void AddTablePairsCode( List<byte> byteList , Hashtable tbl ){
		byteList.Add( Opcode.TABLE );
		byteList.Add( (byte)tbl.Keys.Count );	
		foreach ( string key in tbl.Keys) {
			AddStringCode( byteList , key  );
			AddStringCode( byteList , tbl[ key] as string );			
		}
	}

	static public void AddLoadResourceCode( List<byte> byteList , string resourcePath ){
		ByteCodeScriptTools.AddTextLiteralCode( byteList , resourcePath );
		byteList.Add( Opcode.LOAD_RESOURCE );
	}

	static public void AddCreateGOCode( List<byte> byteList , string parentName ){
		// Add Parent Name.
		if( ! string.IsNullOrEmpty( parentName ) ){
			ByteCodeScriptTools.AddTextLiteralCode( byteList , parentName) ;
		}
		else{
			ByteCodeScriptTools.AddTextLiteralCode( byteList , "" ) ;				
		}		
		byteList.Add( Opcode.INSTANTIATE_AS_GAMEOBJECT );	
	}

	
	/// <summary>
	/// Loads the byte code script text asset.
	/// </summary>
	/// <returns>
	/// The byte code script text asset.
	/// </returns>
	/// <param name='resname'>
	/// Resname.
	/// </param>
	static public byte[] LoadByteCodeScriptTextAsset( string resname){
		byte[] readbytes = null;
		TextAsset txt = Resources.Load( resname ,  typeof( TextAsset ) ) as TextAsset;
		if( txt != null ){
			 readbytes = txt.bytes;	
		}else{
			ViNoDebugger.LogError( "Resources.Load Error! " );	
		}
		return readbytes;
	}	
	
/*	
	static public void AddFunctionCode( List<byte> byteList , string funcname ){
		byteList.Add( Opcode.FUNC );	
		
		Byte[] bytes = new Byte[4];		// int to byte array. 		pc +1 ~ 4
		int returnFuncPos = byteList.Count - 1;
				
		Add( bytes );				// Dummy Add Return Address.	
		AddStringCode( byteList , funcname );	// Func Name.
	}
//*/
	
}
